# -*- coding: utf-8 -*-
"""
    pygments.lexers.gdscript
    ~~~~~~~~~~~~~~~~~~~~~~

    Lexer for GDScript.

    :copyright: Copyright 2xxx by The Godot Engine Community
    :license: MIT.

    modified by Daniel J. Ramirez <djrmuv@gmail.com> based on the original python.py pygment
    further expanded and consolidated with the godot-docs lexer by Zackery R. Smith <zackery.smith82307@gmail.com> and Ste.
"""

from pygments.lexer import RegexLexer, include, bygroups, words, combined
from pygments.token import (
    Keyword,
    Literal,
    Name,
    Comment,
    String,
    Number,
    Operator,
    Whitespace,
    Punctuation,
)

__all__ = ["GDScriptLexer"]


class GDScriptLexer(RegexLexer):
    """
    For GDScript source code.
    """

    name = "GDScript"
    url = "https://www.godotengine.org"
    aliases = ["gdscript", "gd"]
    filenames = ["*.gd"]
    mimetypes = ["text/x-gdscript", "application/x-gdscript"]

    # taken from pygments/gdscript.py
    @staticmethod
    def inner_string_rules(ttype):
        return [
            # the old style '%s' % (...) string formatting
            (
                r"%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?"
                "[hlL]?[E-GXc-giorsux%]",
                String.Interpol,
            ),
            # backslashes, quotes, and formatting signs must be parsed one at a time
            (r'[^\\\'"%\n]+', ttype),
            (r'[\'"\\]', ttype),
            # unhandled string formatting sign
            (r"%", ttype),
            # newlines are an error (use "nl" state)
        ]

    tokens = {
        "whitespace": [(r"\s+", Whitespace)],
        "comment": [
            (r"##.*$", Comment.Doc),
            (r"#(?:end)?region.*$", Comment.Region),
            (r"#.*$", Comment.Single),
        ],
        "punctuation": [
            (r"[]{}(),:;[]", Punctuation),
            (r":\n", Punctuation),
            (r"\\", Punctuation),
        ],
        # NOTE: from github.com/godotengine/godot-docs
        "keyword": [
            (
                words(
                    (
                        # modules/gdscript/gdscript.cpp - GDScriptLanguage::get_reserved_words()
                        # Declarations.
                        "class",
                        "class_name",
                        "const",
                        "enum",
                        "extends",
                        "func",
                        "namespace",  # Reserved for potential future use.
                        "signal",
                        "static",
                        "trait",  # Reserved for potential future use.
                        "var",
                        # Other keywords.
                        "await",
                        "breakpoint",
                        "self",
                        "super",
                        "yield",  # Reserved for potential future use.
                        # Not really keywords, but used in property syntax.
                        # also colored like functions, not keywords
                        #"set",
                        #"get",
                    ),
                    suffix=r"\b",
                ),
                Keyword,
            ),
            (
                words(
                    (
                        # modules/gdscript/gdscript.cpp - GDScriptLanguage::get_reserved_words()
                        # Control flow.
                        "break",
                        "continue",
                        "elif",
                        "else",
                        "for",
                        "if",
                        "match",
                        "pass",
                        "return",
                        "when",
                        "while",
                        "yield",
                    ),
                    suffix=r"\b",
                ),
                # Custom control flow class used to give control flow keywords a different color,
                # like in the Godot editor.
                Keyword.ControlFlow,
            ),
        ],
        "builtin": [
            (
                words(
                    ("true", "false", "PI", "TAU", "NAN", "INF", "null"),
                    prefix=r"(?<!\.)",
                    suffix=r"\b",
                ),
                Literal,
            ),
            # NOTE: from github.com/godotengine/godot-docs
            (
                words(
                    (
                        # doc/classes/@GlobalScope.xml
                        "abs",
                        "absf",
                        "absi",
                        "acos",
                        "acosh",
                        "angle_difference",
                        "asin",
                        "asinh",
                        "atan",
                        "atan2",
                        "atanh",
                        "bezier_derivative",
                        "bezier_interpolate",
                        "bytes_to_var",
                        "bytes_to_var_with_objects",
                        "ceil",
                        "ceilf",
                        "ceili",
                        "clamp",
                        "clampf",
                        "clampi",
                        "cos",
                        "cosh",
                        "cubic_interpolate",
                        "cubic_interpolate_angle",
                        "cubic_interpolate_angle_in_time",
                        "cubic_interpolate_in_time",
                        "db_to_linear",
                        "deg_to_rad",
                        "ease",
                        "error_string",
                        "exp",
                        "floor",
                        "floorf",
                        "floori",
                        "fmod",
                        "fposmod",
                        "hash",
                        "instance_from_id",
                        "inverse_lerp",
                        "is_equal_approx",
                        "is_finite",
                        "is_inf",
                        "is_instance_id_valid",
                        "is_instance_valid",
                        "is_nan",
                        "is_same",
                        "is_zero_approx",
                        "lerp",
                        "lerp_angle",
                        "lerpf",
                        "linear_to_db",
                        "log",
                        "max",
                        "maxf",
                        "maxi",
                        "min",
                        "minf",
                        "mini",
                        "move_toward",
                        "nearest_po2",
                        "pingpong",
                        "posmod",
                        "pow",
                        "print",
                        "print_rich",
                        "print_verbose",
                        "printerr",
                        "printraw",
                        "prints",
                        "printt",
                        "push_error",
                        "push_warning",
                        "rad_to_deg",
                        "rand_from_seed",
                        "randf",
                        "randf_range",
                        "randfn",
                        "randi",
                        "randi_range",
                        "randomize",
                        "remap",
                        "rid_allocate_id",
                        "rid_from_int64",
                        "rotate_toward",
                        "round",
                        "roundf",
                        "roundi",
                        "seed",
                        "sign",
                        "signf",
                        "signi",
                        "sin",
                        "sinh",
                        "smoothstep",
                        "snapped",
                        "snappedf",
                        "snappedi",
                        "sqrt",
                        "step_decimals",
                        "str",
                        "str_to_var",
                        "tan",
                        "tanh",
                        "type_convert",
                        "type_string",
                        "typeof",
                        "var_to_bytes",
                        "var_to_bytes_with_objects",
                        "var_to_str",
                        "weakref",
                        "wrap",
                        "wrapf",
                        "wrapi",

                        # modules/gdscript/doc_classes/@GDScript.xml
                        "Color8",
                        "assert",
                        "char",
                        "convert",
                        "dict_to_inst",
                        "get_stack",
                        "inst_to_dict",
                        "is_instance_of",
                        "len",
                        "load",
                        "ord",
                        "preload",
                        "print_debug",
                        "print_stack",
                        "range",
                        "type_exists",
                    ),
                    prefix=r"(?<!\.)",
                    suffix=r"\b",
                ),
                Name.Builtin.Function,
            ),
            (r"((?<!\.)(self)" r")\b", Name.Builtin.Pseudo),
            # NOTE: from github.com/godotengine/godot-docs
            (
                words(
                    (
                        # core/variant/variant.cpp - Variant::get_type_name()
                        # `Nil` is excluded because it is not allowed in GDScript.
                        "bool",
                        "int",
                        "float",
                        "String",
                        "Vector2",
                        "Vector2i",
                        "Rect2",
                        "Rect2i",
                        "Transform2D",
                        "Vector3",
                        "Vector3i",
                        "Vector4",
                        "Vector4i",
                        "Plane",
                        "AABB",
                        "Quaternion",
                        "Basis",
                        "Transform3D",
                        "Projection",
                        "Color",
                        "RID",
                        "Object",
                        "Callable",
                        "Signal",
                        "StringName",
                        "NodePath",
                        "Dictionary",
                        "Array",
                        "PackedByteArray",
                        "PackedInt32Array",
                        "PackedInt64Array",
                        "PackedFloat32Array",
                        "PackedFloat64Array",
                        "PackedStringArray",
                        "PackedVector2Array",
                        "PackedVector3Array",
                        "PackedColorArray",
                        "PackedVector4Array",
                        # The following are also considered types in GDScript.
                        "Variant",
                        "void",
                    ),
                    prefix=r"(?<!\.)",
                    suffix=r"\b",
                ),
                Name.Builtin.Type,
            ),
            # copied from https://docs.godotengine.org/en/stable/classes/index.html
            (
                words(
                    (
                        # Nodes
                        "Node",
                        "AcceptDialog",
                        "AnimatableBody2D",
                        "AnimatableBody3D",
                        "AnimatedSprite2D",
                        "AnimatedSprite3D",
                        "AnimationMixer",
                        "AnimationPlayer",
                        "AnimationTree",
                        "Area2D",
                        "Area3D",
                        "AspectRatioContainer",
                        "AudioListener2D",
                        "AudioListener3D",
                        "AudioStreamPlayer",
                        "AudioStreamPlayer2D",
                        "AudioStreamPlayer3D",
                        "BackBufferCopy",
                        "BaseButton",
                        "Bone2D",
                        "BoneAttachment3D",
                        "BoxContainer",
                        "Button",
                        "Camera2D",
                        "Camera3D",
                        "CanvasGroup",
                        "CanvasItem",
                        "CanvasLayer",
                        "CanvasModulate",
                        "CenterContainer",
                        "CharacterBody2D",
                        "CharacterBody3D",
                        "CheckBox",
                        "CheckButton",
                        "CodeEdit",
                        "CollisionObject2D",
                        "CollisionObject3D",
                        "CollisionPolygon2D",
                        "CollisionPolygon3D",
                        "CollisionShape2D",
                        "CollisionShape3D",
                        "ColorPicker",
                        "ColorPickerButton",
                        "ColorRect",
                        "ConeTwistJoint3D",
                        "ConfirmationDialog",
                        "Container",
                        "Control",
                        "CPUParticles2D",
                        "CPUParticles3D",
                        "CSGBox3D",
                        "CSGCombiner3D",
                        "CSGCylinder3D",
                        "CSGMesh3D",
                        "CSGPolygon3D",
                        "CSGPrimitive3D",
                        "CSGShape3D",
                        "CSGSphere3D",
                        "CSGTorus3D",
                        "DampedSpringJoint2D",
                        "Decal",
                        "DirectionalLight2D",
                        "DirectionalLight3D",
                        "EditorCommandPalette",
                        "EditorFileDialog",
                        "EditorFileSystem",
                        "EditorInspector",
                        "EditorPlugin",
                        "EditorProperty",
                        "EditorResourcePicker",
                        "EditorResourcePreview",
                        "EditorScriptPicker",
                        "EditorSpinSlider",
                        "EditorToaster",
                        "FileDialog",
                        "FileSystemDock",
                        "FlowContainer",
                        "FogVolume",
                        "Generic6DOFJoint3D",
                        "GeometryInstance3D",
                        "GPUParticles2D",
                        "GPUParticles3D",
                        "GPUParticlesAttractor3D",
                        "GPUParticlesAttractorBox3D",
                        "GPUParticlesAttractorSphere3D",
                        "GPUParticlesAttractorVectorField3D",
                        "GPUParticlesCollision3D",
                        "GPUParticlesCollisionBox3D",
                        "GPUParticlesCollisionHeightField3D",
                        "GPUParticlesCollisionSDF3D",
                        "GPUParticlesCollisionSphere3D",
                        "GraphEdit",
                        "GraphElement",
                        "GraphFrame",
                        "GraphNode",
                        "GridContainer",
                        "GridMap",
                        "GridMapEditorPlugin",
                        "GrooveJoint2D",
                        "HBoxContainer",
                        "HFlowContainer",
                        "HingeJoint3D",
                        "HScrollBar",
                        "HSeparator",
                        "HSlider",
                        "HSplitContainer",
                        "HTTPRequest",
                        "ImporterMeshInstance3D",
                        "InstancePlaceholder",
                        "ItemList",
                        "Joint2D",
                        "Joint3D",
                        "Label",
                        "Label3D",
                        "Light2D",
                        "Light3D",
                        "LightmapGI",
                        "LightmapProbe",
                        "LightOccluder2D",
                        "Line2D",
                        "LineEdit",
                        "LinkButton",
                        "LookAtModifier3D",
                        "MarginContainer",
                        "Marker2D",
                        "Marker3D",
                        "MenuBar",
                        "MenuButton",
                        "MeshInstance2D",
                        "MeshInstance3D",
                        "MissingNode",
                        "MultiMeshInstance2D",
                        "MultiMeshInstance3D",
                        "MultiplayerSpawner",
                        "MultiplayerSynchronizer",
                        "NavigationAgent2D",
                        "NavigationAgent3D",
                        "NavigationLink2D",
                        "NavigationLink3D",
                        "NavigationObstacle2D",
                        "NavigationObstacle3D",
                        "NavigationRegion2D",
                        "NavigationRegion3D",
                        "NinePatchRect",
                        "Node2D",
                        "Node3D",
                        "OccluderInstance3D",
                        "OmniLight3D",
                        "OpenXRBindingModifierEditor",
                        "OpenXRCompositionLayer",
                        "OpenXRCompositionLayerCylinder",
                        "OpenXRCompositionLayerEquirect",
                        "OpenXRCompositionLayerQuad",
                        "OpenXRHand",
                        "OpenXRInteractionProfileEditor",
                        "OpenXRInteractionProfileEditorBase",
                        "OpenXRVisibilityMask",
                        "OptionButton",
                        "Panel",
                        "PanelContainer",
                        "Parallax2D",
                        "ParallaxBackground",
                        "ParallaxLayer",
                        "Path2D",
                        "Path3D",
                        "PathFollow2D",
                        "PathFollow3D",
                        "PhysicalBone2D",
                        "PhysicalBone3D",
                        "PhysicalBoneSimulator3D",
                        "PhysicsBody2D",
                        "PhysicsBody3D",
                        "PinJoint2D",
                        "PinJoint3D",
                        "PointLight2D",
                        "Polygon2D",
                        "Popup",
                        "PopupMenu",
                        "PopupPanel",
                        "ProgressBar",
                        "Range",
                        "RayCast2D",
                        "RayCast3D",
                        "ReferenceRect",
                        "ReflectionProbe",
                        "RemoteTransform2D",
                        "RemoteTransform3D",
                        "ResourcePreloader",
                        "RetargetModifier3D",
                        "RichTextLabel",
                        "RigidBody2D",
                        "RigidBody3D",
                        "RootMotionView",
                        "ScriptCreateDialog",
                        "ScriptEditor",
                        "ScriptEditorBase",
                        "ScrollBar",
                        "ScrollContainer",
                        "Separator",
                        "ShaderGlobalsOverride",
                        "ShapeCast2D",
                        "ShapeCast3D",
                        "Skeleton2D",
                        "Skeleton3D",
                        "SkeletonIK3D",
                        "SkeletonModifier3D",
                        "Slider",
                        "SliderJoint3D",
                        "SoftBody3D",
                        "SpinBox",
                        "SplitContainer",
                        "SpotLight3D",
                        "SpringArm3D",
                        "SpringBoneCollision3D",
                        "SpringBoneCollisionCapsule3D",
                        "SpringBoneCollisionPlane3D",
                        "SpringBoneCollisionSphere3D",
                        "SpringBoneSimulator3D",
                        "Sprite2D",
                        "Sprite3D",
                        "SpriteBase3D",
                        "StaticBody2D",
                        "StaticBody3D",
                        "StatusIndicator",
                        "SubViewport",
                        "SubViewportContainer",
                        "TabBar",
                        "TabContainer",
                        "TextEdit",
                        "TextureButton",
                        "TextureProgressBar",
                        "TextureRect",
                        "TileMap",
                        "TileMapLayer",
                        "Timer",
                        "TouchScreenButton",
                        "Tree",
                        "VBoxContainer",
                        "VehicleBody3D",
                        "VehicleWheel3D",
                        "VFlowContainer",
                        "VideoStreamPlayer",
                        "Viewport",
                        "VisibleOnScreenEnabler2D",
                        "VisibleOnScreenEnabler3D",
                        "VisibleOnScreenNotifier2D",
                        "VisibleOnScreenNotifier3D",
                        "VisualInstance3D",
                        "VoxelGI",
                        "VScrollBar",
                        "VSeparator",
                        "VSlider",
                        "VSplitContainer",
                        "Window",
                        "WorldEnvironment",
                        "XRAnchor3D",
                        "XRBodyModifier3D",
                        "XRCamera3D",
                        "XRController3D",
                        "XRFaceModifier3D",
                        "XRHandModifier3D",
                        "XRNode3D",
                        "XROrigin3D",
                        # Resources
                        "Resource",
                        "AnimatedTexture",
                        "Animation",
                        "AnimationLibrary",
                        "AnimationNode",
                        "AnimationNodeAdd2",
                        "AnimationNodeAdd3",
                        "AnimationNodeAnimation",
                        "AnimationNodeBlend2",
                        "AnimationNodeBlend3",
                        "AnimationNodeBlendSpace1D",
                        "AnimationNodeBlendSpace2D",
                        "AnimationNodeBlendTree",
                        "AnimationNodeExtension",
                        "AnimationNodeOneShot",
                        "AnimationNodeOutput",
                        "AnimationNodeStateMachine",
                        "AnimationNodeStateMachinePlayback",
                        "AnimationNodeStateMachineTransition",
                        "AnimationNodeSub2",
                        "AnimationNodeSync",
                        "AnimationNodeTimeScale",
                        "AnimationNodeTimeSeek",
                        "AnimationNodeTransition",
                        "AnimationRootNode",
                        "ArrayMesh",
                        "ArrayOccluder3D",
                        "AtlasTexture",
                        "AudioBusLayout",
                        "AudioEffect",
                        "AudioEffectAmplify",
                        "AudioEffectBandLimitFilter",
                        "AudioEffectBandPassFilter",
                        "AudioEffectCapture",
                        "AudioEffectChorus",
                        "AudioEffectCompressor",
                        "AudioEffectDelay",
                        "AudioEffectDistortion",
                        "AudioEffectEQ",
                        "AudioEffectEQ10",
                        "AudioEffectEQ21",
                        "AudioEffectEQ6",
                        "AudioEffectFilter",
                        "AudioEffectHardLimiter",
                        "AudioEffectHighPassFilter",
                        "AudioEffectHighShelfFilter",
                        "AudioEffectLimiter",
                        "AudioEffectLowPassFilter",
                        "AudioEffectLowShelfFilter",
                        "AudioEffectNotchFilter",
                        "AudioEffectPanner",
                        "AudioEffectPhaser",
                        "AudioEffectPitchShift",
                        "AudioEffectRecord",
                        "AudioEffectReverb",
                        "AudioEffectSpectrumAnalyzer",
                        "AudioEffectStereoEnhance",
                        "AudioStream",
                        "AudioStreamGenerator",
                        "AudioStreamInteractive",
                        "AudioStreamMicrophone",
                        "AudioStreamMP3",
                        "AudioStreamOggVorbis",
                        "AudioStreamPlaylist",
                        "AudioStreamPolyphonic",
                        "AudioStreamRandomizer",
                        "AudioStreamSynchronized",
                        "AudioStreamWAV",
                        "BaseMaterial3D",
                        "BitMap",
                        "BoneMap",
                        "BoxMesh",
                        "BoxOccluder3D",
                        "BoxShape3D",
                        "ButtonGroup",
                        "CameraAttributes",
                        "CameraAttributesPhysical",
                        "CameraAttributesPractical",
                        "CameraTexture",
                        "CanvasItemMaterial",
                        "CanvasTexture",
                        "CapsuleMesh",
                        "CapsuleShape2D",
                        "CapsuleShape3D",
                        "CircleShape2D",
                        "CodeHighlighter",
                        "ColorPalette",
                        "Compositor",
                        "CompositorEffect",
                        "CompressedCubemap",
                        "CompressedCubemapArray",
                        "CompressedTexture2D",
                        "CompressedTexture2DArray",
                        "CompressedTexture3D",
                        "CompressedTextureLayered",
                        "ConcavePolygonShape2D",
                        "ConcavePolygonShape3D",
                        "ConvexPolygonShape2D",
                        "ConvexPolygonShape3D",
                        "CryptoKey",
                        "CSharpScript",
                        "Cubemap",
                        "CubemapArray",
                        "Curve",
                        "Curve2D",
                        "Curve3D",
                        "CurveTexture",
                        "CurveXYZTexture",
                        "CylinderMesh",
                        "CylinderShape3D",
                        "EditorNode3DGizmoPlugin",
                        "EditorSettings",
                        "EditorSyntaxHighlighter",
                        "Environment",
                        "ExternalTexture",
                        "FastNoiseLite",
                        "FBXDocument",
                        "FBXState",
                        "FogMaterial",
                        "Font",
                        "FontFile",
                        "FontVariation",
                        "GDExtension",
                        "GDScript",
                        "GDScriptSyntaxHighlighter",
                        "GLTFAccessor",
                        "GLTFAnimation",
                        "GLTFBufferView",
                        "GLTFCamera",
                        "GLTFDocument",
                        "GLTFDocumentExtension",
                        "GLTFDocumentExtensionConvertImporterMesh",
                        "GLTFLight",
                        "GLTFMesh",
                        "GLTFNode",
                        "GLTFPhysicsBody",
                        "GLTFPhysicsShape",
                        "GLTFSkeleton",
                        "GLTFSkin",
                        "GLTFSpecGloss",
                        "GLTFState",
                        "GLTFTexture",
                        "GLTFTextureSampler",
                        "Gradient",
                        "GradientTexture1D",
                        "GradientTexture2D",
                        "HeightMapShape3D",
                        "Image",
                        "ImageTexture",
                        "ImageTexture3D",
                        "ImageTextureLayered",
                        "ImmediateMesh",
                        "ImporterMesh",
                        "InputEvent",
                        "InputEventAction",
                        "InputEventFromWindow",
                        "InputEventGesture",
                        "InputEventJoypadButton",
                        "InputEventJoypadMotion",
                        "InputEventKey",
                        "InputEventMagnifyGesture",
                        "InputEventMIDI",
                        "InputEventMouse",
                        "InputEventMouseButton",
                        "InputEventMouseMotion",
                        "InputEventPanGesture",
                        "InputEventScreenDrag",
                        "InputEventScreenTouch",
                        "InputEventShortcut",
                        "InputEventWithModifiers",
                        "JSON",
                        "LabelSettings",
                        "LightmapGIData",
                        "Material",
                        "Mesh",
                        "MeshLibrary",
                        "MeshTexture",
                        "MissingResource",
                        "MultiMesh",
                        "NavigationMesh",
                        "NavigationMeshSourceGeometryData2D",
                        "NavigationMeshSourceGeometryData3D",
                        "NavigationPolygon",
                        "Noise",
                        "NoiseTexture2D",
                        "NoiseTexture3D",
                        "Occluder3D",
                        "OccluderPolygon2D",
                        "OggPacketSequence",
                        "OpenXRAction",
                        "OpenXRActionBindingModifier",
                        "OpenXRActionMap",
                        "OpenXRActionSet",
                        "OpenXRAnalogThresholdModifier",
                        "OpenXRBindingModifier",
                        "OpenXRDpadBindingModifier",
                        "OpenXRHapticBase",
                        "OpenXRHapticVibration",
                        "OpenXRInteractionProfile",
                        "OpenXRIPBinding",
                        "OpenXRIPBindingModifier",
                        "OptimizedTranslation",
                        "ORMMaterial3D",
                        "PackedDataContainer",
                        "PackedScene",
                        "PanoramaSkyMaterial",
                        "ParticleProcessMaterial",
                        "PhysicalSkyMaterial",
                        "PhysicsMaterial",
                        "PlaceholderCubemap",
                        "PlaceholderCubemapArray",
                        "PlaceholderMaterial",
                        "PlaceholderMesh",
                        "PlaceholderTexture2D",
                        "PlaceholderTexture2DArray",
                        "PlaceholderTexture3D",
                        "PlaceholderTextureLayered",
                        "PlaneMesh",
                        "PointMesh",
                        "PolygonOccluder3D",
                        "PolygonPathFinder",
                        "PortableCompressedTexture2D",
                        "PrimitiveMesh",
                        "PrismMesh",
                        "ProceduralSkyMaterial",
                        "QuadMesh",
                        "QuadOccluder3D",
                        "RDShaderFile",
                        "RDShaderSPIRV",
                        "RectangleShape2D",
                        "RibbonTrailMesh",
                        "RichTextEffect",
                        "SceneReplicationConfig",
                        "Script",
                        "ScriptExtension",
                        "SegmentShape2D",
                        "SeparationRayShape2D",
                        "SeparationRayShape3D",
                        "Shader",
                        "ShaderInclude",
                        "ShaderMaterial",
                        "Shape2D",
                        "Shape3D",
                        "Shortcut",
                        "SkeletonModification2D",
                        "SkeletonModification2DCCDIK",
                        "SkeletonModification2DFABRIK",
                        "SkeletonModification2DJiggle",
                        "SkeletonModification2DLookAt",
                        "SkeletonModification2DPhysicalBones",
                        "SkeletonModification2DStackHolder",
                        "SkeletonModification2DTwoBoneIK",
                        "SkeletonModificationStack2D",
                        "SkeletonProfile",
                        "SkeletonProfileHumanoid",
                        "Skin",
                        "Sky",
                        "SphereMesh",
                        "SphereOccluder3D",
                        "SphereShape3D",
                        "SpriteFrames",
                        "StandardMaterial3D",
                        "StyleBox",
                        "StyleBoxEmpty",
                        "StyleBoxFlat",
                        "StyleBoxLine",
                        "StyleBoxTexture",
                        "SyntaxHighlighter",
                        "SystemFont",
                        "TextMesh",
                        "Texture",
                        "Texture2D",
                        "Texture2DArray",
                        "Texture2DArrayRD",
                        "Texture2DRD",
                        "Texture3D",
                        "Texture3DRD",
                        "TextureCubemapArrayRD",
                        "TextureCubemapRD",
                        "TextureLayered",
                        "TextureLayeredRD",
                        "Theme",
                        "TileMapPattern",
                        "TileSet",
                        "TileSetAtlasSource",
                        "TileSetScenesCollectionSource",
                        "TileSetSource",
                        "TorusMesh",
                        "Translation",
                        "TubeTrailMesh",
                        "VideoStream",
                        "VideoStreamPlayback",
                        "VideoStreamTheora",
                        "ViewportTexture",
                        "VisualShader",
                        "VisualShaderNode",
                        "VisualShaderNodeBillboard",
                        "VisualShaderNodeBooleanConstant",
                        "VisualShaderNodeBooleanParameter",
                        "VisualShaderNodeClamp",
                        "VisualShaderNodeColorConstant",
                        "VisualShaderNodeColorFunc",
                        "VisualShaderNodeColorOp",
                        "VisualShaderNodeColorParameter",
                        "VisualShaderNodeComment",
                        "VisualShaderNodeCompare",
                        "VisualShaderNodeConstant",
                        "VisualShaderNodeCubemap",
                        "VisualShaderNodeCubemapParameter",
                        "VisualShaderNodeCurveTexture",
                        "VisualShaderNodeCurveXYZTexture",
                        "VisualShaderNodeCustom",
                        "VisualShaderNodeDerivativeFunc",
                        "VisualShaderNodeDeterminant",
                        "VisualShaderNodeDistanceFade",
                        "VisualShaderNodeDotProduct",
                        "VisualShaderNodeExpression",
                        "VisualShaderNodeFaceForward",
                        "VisualShaderNodeFloatConstant",
                        "VisualShaderNodeFloatFunc",
                        "VisualShaderNodeFloatOp",
                        "VisualShaderNodeFloatParameter",
                        "VisualShaderNodeFrame",
                        "VisualShaderNodeFresnel",
                        "VisualShaderNodeGlobalExpression",
                        "VisualShaderNodeGroupBase",
                        "VisualShaderNodeIf",
                        "VisualShaderNodeInput",
                        "VisualShaderNodeIntConstant",
                        "VisualShaderNodeIntFunc",
                        "VisualShaderNodeIntOp",
                        "VisualShaderNodeIntParameter",
                        "VisualShaderNodeIs",
                        "VisualShaderNodeLinearSceneDepth",
                        "VisualShaderNodeMix",
                        "VisualShaderNodeMultiplyAdd",
                        "VisualShaderNodeOuterProduct",
                        "VisualShaderNodeOutput",
                        "VisualShaderNodeParameter",
                        "VisualShaderNodeParameterRef",
                        "VisualShaderNodeParticleAccelerator",
                        "VisualShaderNodeParticleBoxEmitter",
                        "VisualShaderNodeParticleConeVelocity",
                        "VisualShaderNodeParticleEmit",
                        "VisualShaderNodeParticleEmitter",
                        "VisualShaderNodeParticleMeshEmitter",
                        "VisualShaderNodeParticleMultiplyByAxisAngle",
                        "VisualShaderNodeParticleOutput",
                        "VisualShaderNodeParticleRandomness",
                        "VisualShaderNodeParticleRingEmitter",
                        "VisualShaderNodeParticleSphereEmitter",
                        "VisualShaderNodeProximityFade",
                        "VisualShaderNodeRandomRange",
                        "VisualShaderNodeRemap",
                        "VisualShaderNodeReroute",
                        "VisualShaderNodeResizableBase",
                        "VisualShaderNodeRotationByAxis",
                        "VisualShaderNodeSample3D",
                        "VisualShaderNodeScreenNormalWorldSpace",
                        "VisualShaderNodeScreenUVToSDF",
                        "VisualShaderNodeSDFRaymarch",
                        "VisualShaderNodeSDFToScreenUV",
                        "VisualShaderNodeSmoothStep",
                        "VisualShaderNodeStep",
                        "VisualShaderNodeSwitch",
                        "VisualShaderNodeTexture",
                        "VisualShaderNodeTexture2DArray",
                        "VisualShaderNodeTexture2DArrayParameter",
                        "VisualShaderNodeTexture2DParameter",
                        "VisualShaderNodeTexture3D",
                        "VisualShaderNodeTexture3DParameter",
                        "VisualShaderNodeTextureParameter",
                        "VisualShaderNodeTextureParameterTriplanar",
                        "VisualShaderNodeTextureSDF",
                        "VisualShaderNodeTextureSDFNormal",
                        "VisualShaderNodeTransformCompose",
                        "VisualShaderNodeTransformConstant",
                        "VisualShaderNodeTransformDecompose",
                        "VisualShaderNodeTransformFunc",
                        "VisualShaderNodeTransformOp",
                        "VisualShaderNodeTransformParameter",
                        "VisualShaderNodeTransformVecMult",
                        "VisualShaderNodeUIntConstant",
                        "VisualShaderNodeUIntFunc",
                        "VisualShaderNodeUIntOp",
                        "VisualShaderNodeUIntParameter",
                        "VisualShaderNodeUVFunc",
                        "VisualShaderNodeUVPolarCoord",
                        "VisualShaderNodeVarying",
                        "VisualShaderNodeVaryingGetter",
                        "VisualShaderNodeVaryingSetter",
                        "VisualShaderNodeVec2Constant",
                        "VisualShaderNodeVec2Parameter",
                        "VisualShaderNodeVec3Constant",
                        "VisualShaderNodeVec3Parameter",
                        "VisualShaderNodeVec4Constant",
                        "VisualShaderNodeVec4Parameter",
                        "VisualShaderNodeVectorBase",
                        "VisualShaderNodeVectorCompose",
                        "VisualShaderNodeVectorDecompose",
                        "VisualShaderNodeVectorDistance",
                        "VisualShaderNodeVectorFunc",
                        "VisualShaderNodeVectorLen",
                        "VisualShaderNodeVectorOp",
                        "VisualShaderNodeVectorRefract",
                        "VisualShaderNodeWorldPositionFromDepth",
                        "VoxelGIData",
                        "World2D",
                        "World3D",
                        "WorldBoundaryShape2D",
                        "WorldBoundaryShape3D",
                        "X509Certificate",
                        # Other objects
                        "Object",
                        "AESContext",
                        "AStar2D",
                        "AStar3D",
                        "AStarGrid2D",
                        "AudioEffectInstance",
                        "AudioEffectSpectrumAnalyzerInstance",
                        "AudioSample",
                        "AudioSamplePlayback",
                        "AudioServer",
                        "AudioStreamGeneratorPlayback",
                        "AudioStreamPlayback",
                        "AudioStreamPlaybackInteractive",
                        "AudioStreamPlaybackOggVorbis",
                        "AudioStreamPlaybackPlaylist",
                        "AudioStreamPlaybackPolyphonic",
                        "AudioStreamPlaybackResampled",
                        "AudioStreamPlaybackSynchronized",
                        "CallbackTweener",
                        "CameraFeed",
                        "CameraServer",
                        "CharFXTransform",
                        "ClassDB",
                        "ConfigFile",
                        "Crypto",
                        "DirAccess",
                        "DisplayServer",
                        "DTLSServer",
                        "EditorContextMenuPlugin",
                        "EditorDebuggerPlugin",
                        "EditorDebuggerSession",
                        "EditorExportPlatform",
                        "EditorExportPlatformAndroid",
                        "EditorExportPlatformExtension",
                        "EditorExportPlatformIOS",
                        "EditorExportPlatformLinuxBSD",
                        "EditorExportPlatformMacOS",
                        "EditorExportPlatformPC",
                        "EditorExportPlatformWeb",
                        "EditorExportPlatformWindows",
                        "EditorExportPlugin",
                        "EditorExportPreset",
                        "EditorFeatureProfile",
                        "EditorFileSystemDirectory",
                        "EditorFileSystemImportFormatSupportQuery",
                        "EditorImportPlugin",
                        "EditorInspectorPlugin",
                        "EditorInterface",
                        "EditorNode3DGizmo",
                        "EditorPaths",
                        "EditorResourceConversionPlugin",
                        "EditorResourcePreviewGenerator",
                        "EditorResourceTooltipPlugin",
                        "EditorSceneFormatImporter",
                        "EditorSceneFormatImporterBlend",
                        "EditorSceneFormatImporterFBX2GLTF",
                        "EditorSceneFormatImporterGLTF",
                        "EditorSceneFormatImporterUFBX",
                        "EditorScenePostImport",
                        "EditorScenePostImportPlugin",
                        "EditorScript",
                        "EditorSelection",
                        "EditorTranslationParserPlugin",
                        "EditorUndoRedoManager",
                        "EditorVCSInterface",
                        "EncodedObjectAsID",
                        "ENetConnection",
                        "ENetMultiplayerPeer",
                        "ENetPacketPeer",
                        "Engine",
                        "EngineDebugger",
                        "EngineProfiler",
                        "Expression",
                        "FileAccess",
                        "FramebufferCacheRD",
                        "GDExtensionManager",
                        "Geometry2D",
                        "Geometry3D",
                        "GLTFObjectModelProperty",
                        "HashingContext",
                        "HMACContext",
                        "HTTPClient",
                        "ImageFormatLoader",
                        "ImageFormatLoaderExtension",
                        "Input",
                        "InputMap",
                        "IntervalTweener",
                        "IP",
                        "JavaClass",
                        "JavaClassWrapper",
                        "JavaObject",
                        "JavaScriptBridge",
                        "JavaScriptObject",
                        "JNISingleton",
                        "JSONRPC",
                        "KinematicCollision2D",
                        "KinematicCollision3D",
                        "Lightmapper",
                        "LightmapperRD",
                        "MainLoop",
                        "Marshalls",
                        "MeshConvexDecompositionSettings",
                        "MeshDataTool",
                        "MethodTweener",
                        "MobileVRInterface",
                        "MovieWriter",
                        "MultiplayerAPI",
                        "MultiplayerAPIExtension",
                        "MultiplayerPeer",
                        "MultiplayerPeerExtension",
                        "Mutex",
                        "NativeMenu",
                        "NavigationMeshGenerator",
                        "NavigationPathQueryParameters2D",
                        "NavigationPathQueryParameters3D",
                        "NavigationPathQueryResult2D",
                        "NavigationPathQueryResult3D",
                        "NavigationServer2D",
                        "NavigationServer3D",
                        "Node",
                        "Node3DGizmo",
                        "OfflineMultiplayerPeer",
                        "OggPacketSequencePlayback",
                        "OpenXRAPIExtension",
                        "OpenXRExtensionWrapperExtension",
                        "OpenXRInteractionProfileMetadata",
                        "OpenXRInterface",
                        "OS",
                        "PackedDataContainerRef",
                        "PacketPeer",
                        "PacketPeerDTLS",
                        "PacketPeerExtension",
                        "PacketPeerStream",
                        "PacketPeerUDP",
                        "PCKPacker",
                        "Performance",
                        "PhysicsDirectBodyState2D",
                        "PhysicsDirectBodyState2DExtension",
                        "PhysicsDirectBodyState3D",
                        "PhysicsDirectBodyState3DExtension",
                        "PhysicsDirectSpaceState2D",
                        "PhysicsDirectSpaceState2DExtension",
                        "PhysicsDirectSpaceState3D",
                        "PhysicsDirectSpaceState3DExtension",
                        "PhysicsPointQueryParameters2D",
                        "PhysicsPointQueryParameters3D",
                        "PhysicsRayQueryParameters2D",
                        "PhysicsRayQueryParameters3D",
                        "PhysicsServer2D",
                        "PhysicsServer2DExtension",
                        "PhysicsServer2DManager",
                        "PhysicsServer3D",
                        "PhysicsServer3DExtension",
                        "PhysicsServer3DManager",
                        "PhysicsServer3DRenderingServerHandler",
                        "PhysicsShapeQueryParameters2D",
                        "PhysicsShapeQueryParameters3D",
                        "PhysicsTestMotionParameters2D",
                        "PhysicsTestMotionParameters3D",
                        "PhysicsTestMotionResult2D",
                        "PhysicsTestMotionResult3D",
                        "ProjectSettings",
                        "PropertyTweener",
                        "RandomNumberGenerator",
                        "RDAttachmentFormat",
                        "RDFramebufferPass",
                        "RDPipelineColorBlendState",
                        "RDPipelineColorBlendStateAttachment",
                        "RDPipelineDepthStencilState",
                        "RDPipelineMultisampleState",
                        "RDPipelineRasterizationState",
                        "RDPipelineSpecializationConstant",
                        "RDSamplerState",
                        "RDShaderSource",
                        "RDTextureFormat",
                        "RDTextureView",
                        "RDUniform",
                        "RDVertexAttribute",
                        "RefCounted",
                        "RegEx",
                        "RegExMatch",
                        "RenderData",
                        "RenderDataExtension",
                        "RenderDataRD",
                        "RenderingDevice",
                        "RenderingServer",
                        "RenderSceneBuffers",
                        "RenderSceneBuffersConfiguration",
                        "RenderSceneBuffersExtension",
                        "RenderSceneBuffersRD",
                        "RenderSceneData",
                        "RenderSceneDataExtension",
                        "RenderSceneDataRD",
                        "Resource",
                        "ResourceFormatLoader",
                        "ResourceFormatSaver",
                        "ResourceImporter",
                        "ResourceImporterBitMap",
                        "ResourceImporterBMFont",
                        "ResourceImporterCSVTranslation",
                        "ResourceImporterDynamicFont",
                        "ResourceImporterImage",
                        "ResourceImporterImageFont",
                        "ResourceImporterLayeredTexture",
                        "ResourceImporterMP3",
                        "ResourceImporterOBJ",
                        "ResourceImporterOggVorbis",
                        "ResourceImporterScene",
                        "ResourceImporterShaderFile",
                        "ResourceImporterTexture",
                        "ResourceImporterTextureAtlas",
                        "ResourceImporterWAV",
                        "ResourceLoader",
                        "ResourceSaver",
                        "ResourceUID",
                        "SceneMultiplayer",
                        "SceneState",
                        "SceneTree",
                        "SceneTreeTimer",
                        "ScriptLanguage",
                        "ScriptLanguageExtension",
                        "Semaphore",
                        "ShaderIncludeDB",
                        "SkinReference",
                        "StreamPeer",
                        "StreamPeerBuffer",
                        "StreamPeerExtension",
                        "StreamPeerGZIP",
                        "StreamPeerTCP",
                        "StreamPeerTLS",
                        "SubtweenTweener",
                        "SurfaceTool",
                        "TCPServer",
                        "TextLine",
                        "TextParagraph",
                        "TextServer",
                        "TextServerAdvanced",
                        "TextServerDummy",
                        "TextServerExtension",
                        "TextServerFallback",
                        "TextServerManager",
                        "ThemeDB",
                        "Thread",
                        "TileData",
                        "Time",
                        "TLSOptions",
                        "TranslationDomain",
                        "TranslationServer",
                        "TreeItem",
                        "TriangleMesh",
                        "Tween",
                        "Tweener",
                        "UDPServer",
                        "UndoRedo",
                        "UniformSetCacheRD",
                        "UPNP",
                        "UPNPDevice",
                        "WeakRef",
                        "WebRTCDataChannel",
                        "WebRTCDataChannelExtension",
                        "WebRTCMultiplayerPeer",
                        "WebRTCPeerConnection",
                        "WebRTCPeerConnectionExtension",
                        "WebSocketMultiplayerPeer",
                        "WebSocketPeer",
                        "WebXRInterface",
                        "WorkerThreadPool",
                        "XMLParser",
                        "XRBodyTracker",
                        "XRControllerTracker",
                        "XRFaceTracker",
                        "XRHandTracker",
                        "XRInterface",
                        "XRInterfaceExtension",
                        "XRPose",
                        "XRPositionalTracker",
                        "XRServer",
                        "XRTracker",
                        "XRVRS",
                        "ZIPPacker",
                        "ZIPReader",
                        # Editor-only
                        "EditorCommandPalette",
                        "EditorContextMenuPlugin",
                        "EditorDebuggerPlugin",
                        "EditorDebuggerSession",
                        "EditorExportPlatform",
                        "EditorExportPlatformAndroid",
                        "EditorExportPlatformExtension",
                        "EditorExportPlatformIOS",
                        "EditorExportPlatformLinuxBSD",
                        "EditorExportPlatformMacOS",
                        "EditorExportPlatformPC",
                        "EditorExportPlatformWeb",
                        "EditorExportPlatformWindows",
                        "EditorExportPlugin",
                        "EditorExportPreset",
                        "EditorFeatureProfile",
                        "EditorFileDialog",
                        "EditorFileSystem",
                        "EditorFileSystemDirectory",
                        "EditorFileSystemImportFormatSupportQuery",
                        "EditorImportPlugin",
                        "EditorInspector",
                        "EditorInspectorPlugin",
                        "EditorInterface",
                        "EditorNode3DGizmo",
                        "EditorNode3DGizmoPlugin",
                        "EditorPaths",
                        "EditorPlugin",
                        "EditorProperty",
                        "EditorResourceConversionPlugin",
                        "EditorResourcePicker",
                        "EditorResourcePreview",
                        "EditorResourcePreviewGenerator",
                        "EditorResourceTooltipPlugin",
                        "EditorSceneFormatImporter",
                        "EditorSceneFormatImporterBlend",
                        "EditorSceneFormatImporterFBX2GLTF",
                        "EditorSceneFormatImporterGLTF",
                        "EditorSceneFormatImporterUFBX",
                        "EditorScenePostImport",
                        "EditorScenePostImportPlugin",
                        "EditorScript",
                        "EditorScriptPicker",
                        "EditorSelection",
                        "EditorSettings",
                        "EditorSpinSlider",
                        "EditorSyntaxHighlighter",
                        "EditorToaster",
                        "EditorTranslationParserPlugin",
                        "EditorUndoRedoManager",
                        "EditorVCSInterface",
                        "FileSystemDock",
                        "ScriptCreateDialog",
                        "ScriptEditor",
                        "ScriptEditorBase",
                    ),
                    prefix=r"(?<!\.)",
                    suffix=r"\b",
                ),
                Name.Builtin,
            ),
            # NOTE: from github.com/godotengine/godot-docs
            (
                words(
                    (
                        # modules/gdscript/doc_classes/@GDScript.xml
                        "@abstract",
                        "@export",
                        "@export_category",
                        "@export_color_no_alpha",
                        "@export_custom",
                        "@export_dir",
                        "@export_enum",
                        "@export_exp_easing",
                        "@export_file",
                        "@export_file_path",
                        "@export_flags",
                        "@export_flags_2d_navigation",
                        "@export_flags_2d_physics",
                        "@export_flags_2d_render",
                        "@export_flags_3d_navigation",
                        "@export_flags_3d_physics",
                        "@export_flags_3d_render",
                        "@export_flags_avoidance",
                        "@export_global_dir",
                        "@export_global_file",
                        "@export_group",
                        "@export_multiline",
                        "@export_node_path",
                        "@export_placeholder",
                        "@export_range",
                        "@export_storage",
                        "@export_subgroup",
                        "@export_tool_button",
                        "@icon",
                        "@onready",
                        "@rpc",
                        "@static_unload",
                        "@tool",
                        "@warning_ignore",
                        "@warning_ignore_restore",
                        "@warning_ignore_start",
                    ),
                    prefix=r"(?<!\.)",
                    suffix=r"\b",
                ),
                Name.Decorator,
            ),
        ],
        "operator": [
            (
                r"!=|==|<<|>>|&&|\+=|-=|\*=|/=|%=|&=|\|=|\|\||[-~+/*%=<>&^.!|$]",
                Operator,
            ),
            (r"(in|is|and|as|or|not)\b", Operator.Word),
        ],
        "number": [
            (r"([\d_]+\.[\d_]*|[\d_]*\.[\d_]+)([eE][+-]?[\d_]+)?", Number.Float),
            (r"[\d_]+[eE][+-]?[\d_]+", Number.Float),
            (r"0[xX][a-fA-F\d_]+", Number.Hex),
            (r"(-)?0[bB]([01]|(?<=[01])_)+", Number.Bin),
            (r"[\d_]+", Number.Integer),
        ],
        "name": [(r"[a-zA-Z_]\w*", Name)],
        "typehint": [
            (r"[a-zA-Z_]\w*", Name.Class, "#pop"),
        ],
        "string_escape": [
            (
                r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|'
                r"U[a-fA-F0-9]{6}|x[a-fA-F0-9]{2}|[0-7]{1,3})",
                String.Escape,
            )
        ],
        "string_single": inner_string_rules(String.Single),
        "string_double": inner_string_rules(String.Double),
        "string_other": inner_string_rules(String.Other),
        "string_stringname": inner_string_rules(String.StringName),
        "string_nodepath": inner_string_rules(String.NodePath),
        "double_quotes": [
            (r'"', String.Double, "#pop"),
            (r'\\\\|\\"|\\\n', String.Escape),  # included here for raw strings
            include("string_double"),
        ],
        "single_quotes": [
            (r"'", String.Single, "#pop"),
            (r"\\\\|\\'|\\\n", String.Escape),  # included here for raw strings
            include("string_single"),
        ],
        "triple_double_quotes": [
            (r'"""', String.Double, "#pop"),
            include("string_double"),
            include("whitespace"),
        ],
        "triple_single_quotes": [
            (r"'''", String.Single, "#pop"),
            include("string_single"),
            include("whitespace"),
        ],
        "node_reference": [
            (r'[\$%]"', String.Other, include("node_reference_double")),
            (r"[\$%]'", String.Other, include("node_reference_single")),
            (r"[\$%][A-Za-z_][\w/]*/?", String.Other),
        ],
        "node_reference_double": [
            (r'"', String.Other, "#pop"),
            include("string_other"),
        ],
        "node_reference_single": [
            (r"'", String.Other, "#pop"),
            include("string_other"),
        ],
        "stringname": [
            (r'[&]"', String.StringName, include("stringname_double")),
            (r"[&]'", String.StringName, include("stringname_single")),
        ],
        "stringname_double": [
            (r'"', String.StringName, "#pop"),
            include("string_stringname"),
        ],
        "stringname_single": [
            (r"'", String.StringName, "#pop"),
            include("string_stringname"),
        ],
        "nodepath": [
            (r'[\^]"', String.NodePath, include("nodepath_double")),
            (r"[\^]'", String.NodePath, include("nodepath_single")),
        ],
        "nodepath_double": [
            (r'"', String.NodePath, "#pop"),
            include("string_nodepath"),
        ],
        "nodepath_single": [
            (r"'", String.NodePath, "#pop"),
            include("string_nodepath"),
        ],
        "function_name": [(r"[a-zA-Z_]\w*", Name.Function.Declaration, "#pop")],
        "enum_name": [(r"[a-zA-Z_]\w*", Name, "#pop")],
        "function": [
            (r"\b([a-zA-Z_]\w*)\s*(?=\()", Name.Function),
            (
                # colored like functions, even without braces
                words(("set", "get",), suffix=r"\b", ),
                Name.Function,
            ),
        ],

        #######################################################################
        # LEXER ENTRY POINT
        #######################################################################
        "root": [
            include("whitespace"),
            include("comment"),
            include("punctuation"),
            include("builtin"),
            # strings
            include("stringname"),
            include("nodepath"),
            include("node_reference"),
            (
                '(r)(""")',
                bygroups(String.Affix, String.Double),
                "triple_double_quotes",
            ),
            (
                "(r)(''')",
                bygroups(String.Affix, String.Single),
                "triple_single_quotes",
            ),
            (
                '(r)(")',
                bygroups(String.Affix, String.Double),
                "double_quotes",
            ),
            (
                "(r)(')",
                bygroups(String.Affix, String.Single),
                "single_quotes",
            ),
            (
                '(r?)(""")',
                bygroups(String.Affix, String.Double),
                combined("string_escape", "triple_double_quotes"),
            ),
            (
                "(r?)(''')",
                bygroups(String.Affix, String.Single),
                combined("string_escape", "triple_single_quotes"),
            ),
            (
                '(r?)(")',
                bygroups(String.Affix, String.Double),
                combined("string_escape", "double_quotes"),
            ),
            (
                "(r?)(')",
                bygroups(String.Affix, String.Single),
                combined("string_escape", "single_quotes"),
            ),
            # consider Name after a . as instance/members variables
            (r"(?<!\.)(\.)([a-zA-Z_]\w*)\b(?!\s*\()", bygroups(Operator, Name.Variable.Instance)),
            include("operator"),
            # Lookahead to not match the start of function_name to dodge errors on nameless lambdas
            (r"(func)(\s+)(?=[a-zA-Z_])", bygroups(Keyword, Whitespace), "function_name"),
            (r"(enum)(\s+)(?=[a-zA-Z_])", bygroups(Keyword, Whitespace), "enum_name"),
            include("keyword"),
            include("function"),
            # NOTE:
            #   This matches all PascalCase as a class. If this raises issues
            #   please report it.
            # see: https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_styleguide.html#naming-conventions
            #(r"\s*([A-Z][a-zA-Z0-9_]*)", Name.Class),
            # Only PascalCase, but exclude SCREAMING_SNAKE for constants
            (r"\b([A-Z][a-z0-9]+(?:[A-Z][a-z0-9]+)*)\b", Name.Class),
            include("name"),
            include("number"),
        ],
    }


def setup(sphinx):
    sphinx.add_lexer("gdscript", GDScriptLexer)

    return {
        "parallel_read_safe": True,
        "parallel_write_safe": True,
    }
